package com.hsgene.order.persistence;

import com.hsgene.order.domain.applets.*;
import com.hsgene.order.domain.billing.dto.OrderInvoiceInfoDto;
import com.hsgene.order.domain.v1.GeneticTestingOrderPayment;
import com.hsgene.order.queue.OrderInfo;
import com.hsgene.order.queue.OrderQueueInfo;
import com.hsgene.user.domain.AppletsUserInfoDto;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;

import java.util.Date;
import java.util.List;

/**
 * 小程序订单repository
 *
 * @author wxf
 * @date 2018/10/16 14:37
 **/
@Repository
public interface AppletsOrderRepository {
    /**
     * 提交订单
     *
     * @param orderId            订单id
     * @param orderNo            订单编号
     * @param orderSubmitInfoDto 订单信息
     * @param createTime         创建时间
     * @param testProves         检测证明
     */
    void inserOrderBasicInfo(@Param("orderId") String orderId, @Param("orderNo") String orderNo,
                             @Param("orderSubmitInfo") AppletsOrderSubmitInfoDto orderSubmitInfoDto,
                             @Param("createTime") Date createTime, @Param("testProves") String testProves);

    /**
     * A表插入
     *
     * @param id         订单A表id
     * @param orderId    订单编号
     * @param createTime 时间
     */
    void inserOrderA(@Param("id") String id, @Param("orderId") String orderId, @Param("createTime") Date createTime);

    /**
     * B表插入
     *
     * @param id       订单B表id
     * @param orderId  订单编号
     * @param sumPrice 总价
     * @param disPrice 优惠价格
     */
    void inserOrderB(@Param("id") String id, @Param("orderId") String orderId, @Param("sumPrice") Double sumPrice,
                     @Param("disPrice") Double disPrice);

    /**
     * 订单套餐信息
     *
     * @param orderId         订单id
     * @param packageInfoDtos 套餐信息
     */
    void insertOrderPackage(@Param("orderId") String orderId,
                            @Param("packageInfoDtos") List<AppletsOrderPackageInfoDto> packageInfoDtos);

    /**
     * 支付信息
     *
     * @param id         id
     * @param orderId    订单id
     * @param createTime 创建时间
     */
    void inserPayInfo(@Param("id") String id, @Param("orderId") String orderId, @Param("createTime") Date createTime);

    /**
     * 更新订单表
     *
     * @param orderId    订单ID
     * @param updateTime 时间
     * @param status     状态
     * @param charged    订单结算状态
     * @return
     */
    Boolean updateOrder(@Param("orderId") String orderId, @Param("updateTime") Date updateTime,
                        @Param("status") Integer status, @Param("charged") String charged);

    /**
     * 更新订单套餐
     *
     * @param orderId    订单id
     * @param updateTime
     */
    void updateOrderPackage(@Param("orderId") String orderId, @Param("updateTime") Date updateTime);

    /**
     * 更新订单支付表
     *
     * @param paymentInfo 支付信息
     * @param updateTime  更新时间
     */
    void updateOrderPayment(@Param("paymentInfo") GeneticTestingOrderPayment paymentInfo,
                            @Param("updateTime") Date updateTime);

    /**
     * 校验订单套餐是否过期
     *
     * @param orderId 订单id
     * @return
     */
    List<AppletsOrderPackageInfoDto> checkOrderPackage(@Param("orderId") String orderId);

    /**
     * 获取订单列表
     *
     * @param userId      用户id
     * @param orderStatus 订单状态
     * @param offset
     * @param size
     * @return
     */
    List<AppletsOrderListInfoDto> getOrderList(@Param("userId") String userId, @Param("status") String[] orderStatus,
                                               @Param("offset") Integer offset, @Param("size") Integer size);

    /**
     * 取消订单
     *
     * @param cancerInfoDto 取消信息
     * @param cancerTime
     * @return
     */
    Boolean orderCancer(@Param("cancerInfo") AppletsOrderCancerInfoDto cancerInfoDto, @Param("cancerTime") Date
            cancerTime);

    /**
     * 校验订单是否有效
     *
     * @param orderId 订单id
     * @param status  状态
     * @return
     */
    Integer checkOrderIsEffect(@Param("orderId") String orderId, @Param("status") Integer status);

    /**
     * 获取用户信息
     *
     * @param userId 用户id
     * @return
     */
    AppletsUserInfoDto getUserInfo(@Param("userId") String userId);

    /**
     * 添加评论
     *
     * @param userInfo       用户信息
     * @param createTime     创建时间
     * @param commentInfoDto 评论信息
     */
    void orderComment(@Param("userInfo") AppletsUserInfoDto userInfo, @Param("createTime") Date createTime,
                      @Param("commentInfo") AppletsOrderCommentInfoDto commentInfoDto);

    /**
     * 校验用户订单
     *
     * @param orderId 订单id
     * @param userId  用户id
     * @param status  状态
     * @return
     */
    Integer checkUserOrder(@Param("orderId") String orderId, @Param("userId") String userId,
                           @Param("status") Integer status);

    /**
     * 获取订单详情
     * @param orderId 订单id
     * @return
     */
    AppletsOrderDetailsInfoDto getOrderDetails(@Param("orderId")String orderId);

    /**
     * 获取检测人、收件人信息
     * @param id id
     * @return
     */
    AppletsOrderConsigneeInfoDto getConsigneeInfo(@Param("id")String id);

    /**
     * 获取物流信息
     * @param orderId 订单id
     * @return
     */
    AppletsOrderLogisticInfoDto getOrderLogistic(@Param("orderId")String orderId);

    /**
     * 获取订单总数
     * @param userId 用户id
     * @param orderStatus 订单状态
     * @return
     */
    Integer getOrderSum(@Param("userId")String userId, @Param("status")String[] orderStatus);

    /**
     * 分类信息
     * @return
     * @param userId 用户ID
     */
    List<AppletsOrderTypeInfo> getOrderTypeInfo(@Param("userId")String userId);

    /**
     * 删除购物车数据
     * @param userId 用户id
     * @param packageInfoDtos 套餐信息
     */
    void deleteShoppingCarPackage(@Param("userId")String userId,
                                  @Param("packageInfos")List<AppletsOrderPackageInfoDto> packageInfoDtos);

    /**
     * 优惠券适使用
     * @param userId 用户id
     * @param discountId 优惠券id
     * @param status 状态
     */
    void updateUserDiscount(@Param("userId")String userId, @Param("discountId")String discountId,
                            @Param("status")int status);

    /**
     * 获取所有未付款订单
     * @return
     */
    List<OrderInfo> getAllNoPayOrder();

    /**
     * 订单自动取消
     * @param orderId 订单id
     */
    void orderAutomaticCancer(@Param("orderId")String orderId);

    /**
     * 删除订单发票信息
     * @param orderId 订单id
     */
    void deleteOrderInvoice(@Param("orderId")String orderId);

    /**
     * 插入发票信息
     * @param invoiceInfoDto 发票信息
     */
    void inserInvoiceInfo(OrderInvoiceInfoDto invoiceInfoDto);
}
